﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidad;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace Dao
{
    public class InscripXAlumnoDao
    {
        private static SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AcademicoConnectionString"].ConnectionString);
        public static SqlCommand cmd;
        public static SqlTransaction tran;

        public InscripXAlumnoDao()
        {
            tran = null;
        }

        internal static void InsertarInscripcion(InscripcionXAlumno insXalu, SqlConnection cn, SqlTransaction tran)
        {
            string sql = "insert into InscripcionXAlumno (legajo, codAsignatura, fecha, codEstado) values (@Legajo, @CodAsignatura, @Fecha, @CodEstado); Select @@Identity as InsId";
            cmd = new SqlCommand(sql, cn, tran);
            cmd.Parameters.Add("@Legajo",SqlDbType.Int).Value=insXalu.legajo;
            cmd.Parameters.Add("@CodAsignatura", SqlDbType.Int).Value= insXalu.codAsignatura;
            cmd.Parameters.Add("@Fecha", SqlDbType.Date).Value= insXalu.fecha;
            cmd.Parameters.Add("@CodEstado", SqlDbType.Int).Value= insXalu.codEstado;
            insXalu.codInscripcion = Convert.ToInt32(cmd.ExecuteScalar());
        }
        internal static void ActualizarCapacidad(int cod, SqlConnection cn, SqlTransaction tran)
        {

            string sql = "update curso Set capacidad=capacidad-1 from Curso c inner join Asignatura a on c.codCurso=a.codCurso where a.codAsignatura=@CodAsignatura";
            cmd = new SqlCommand(sql, cn, tran);
            cmd.Parameters.AddWithValue("@CodAsignatura", cod);
            cmd.ExecuteNonQuery();
        }
        public static void Insertar(List<InscripcionXAlumno> ins)
        {

            try
            {
                cn.Open();
                tran = cn.BeginTransaction();

                foreach (InscripcionXAlumno insXalu in ins)
                {

                    InsertarInscripcion(insXalu, cn, tran);
                    ActualizarCapacidad(insXalu.codAsignatura,cn,tran);
                }

                tran.Commit();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                {
                    tran.Rollback();
                    cn.Close();
                }
                throw new ApplicationException("Error al insertar el Inscripcion.\n Problemas:" + ex.Message);
            }


        }
        public static bool ValidarCapacidad(int codAsignatura)
        {
            string sql = @"SELECT        Curso.capacidad
                                    FROM            Curso INNER JOIN
                         Asignatura ON Curso.codCurso = Asignatura.codCurso
                        where asignatura.codAsignatura = @CodAsignatura";
            cmd = new SqlCommand(sql, cn);
            cmd.Parameters.AddWithValue("@CodAsignatura", codAsignatura);
            bool valido = false;
            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    if(int.Parse(dr[0].ToString()) > 0 )
                        valido = true;
                }
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD validar capacidad \n Problema:" + ex.Message);
            }
            return valido;
        }
        public static bool ValidarInscripcion(int codAsignatura, int legajo)
        {
            string sql = @"SELECT codInscripcion FROM InscripcionXAlumno  where codAsignatura = @CodAsignatura and legajo=@Legajo";
            cmd = new SqlCommand(sql, cn);
            cmd.Parameters.AddWithValue("@CodAsignatura", codAsignatura);
            cmd.Parameters.AddWithValue("@Legajo", legajo);
            bool valido = true;
            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    if(dr.HasRows)
                        valido = false;
                }
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD validar inscripcion \n Problema:" + ex.Message);
            }
            return valido;
        }
        public static List<Asignatura> ObtenerAsignaturas(int codCarrera)
        {
            List<Asignatura> listAsignatura = new List<Asignatura>();
            string sql = @"SELECT    a.codAsignatura, m.nombre, c.numAula, a.turno
                         FROM Asignatura a INNER JOIN
                         Curso c ON a.codCurso = c.codCurso INNER JOIN
                         Materia m ON a.codMateria = m.codMateria
                         WHERE m.codCarrera = @CodCarrera ORDER BY m.nombre";
            SqlCommand cmd = new SqlCommand(sql, cn);
            cmd.Parameters.Add("@CodCarrera", SqlDbType.Int).Value = codCarrera;
            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Asignatura asi = new Asignatura();
                    asi.codAsignatura = (int)dr[0];
                    asi.nombreMateria = dr[1].ToString() + " - Aula " + dr[2].ToString() + " - " + dr[3].ToString();
                    
                    listAsignatura.Add(asi);
                }
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD Asignatura \n Problema:" + ex.Message);
            }
            return listAsignatura;

        }
    }
}
